package com.guojiu.common.wechat.service;


import com.guojiu.common.util.wechat.MessageUtil;
import com.guojiu.common.wechat.message.TextMessage;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class CoreService {
    /**
     * 处理微信发来的请求
     * @param request
     * @return xml
     */
    public static String processRequest(HttpServletRequest request) {
        // xml格式的消息数据
        String respXml = null;
        // 默认返回的文本消息内容
        String respContent = "未知的消息类型！";
        try {
            // 调用parseXml方法解析请求消息
            Map<String, String> requestMap = MessageUtil.parseXml(request);
            // 发送方帐号
            String fromUserName = requestMap.get("FromUserName");
            // 开发者微信号
            String toUserName = requestMap.get("ToUserName");
            // 消息类型
            String msgType = requestMap.get("MsgType");

            // 回复文本消息
            TextMessage textMessage = new TextMessage();
            textMessage.setToUserName(fromUserName);
            textMessage.setFromUserName(toUserName);
            textMessage.setCreateTime(new Date().getTime());
            textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
            System.out.println("fromUserName:"+fromUserName+",toUserName:"+toUserName+",content:"+requestMap.get("Content"));

            // 文本消息
            if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
                respContent = "您发送的是文本消息！";
            }
            // 图片消息
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
                respContent = "您发送的是图片消息！";
            }
            // 语音消息
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
                respContent = "您发送的是语音消息！";
            }
            // 视频消息
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)) {
                respContent = "您发送的是视频消息！";
            }
            // 视频消息
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_SHORTVIDEO)) {
                respContent = "您发送的是小视频消息！";
            }
            // 地理位置消息
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
                respContent = "您发送的是地理位置消息！";
            }
            // 链接消息
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
                respContent = "您发送的是链接消息！";
            }
            // 事件推送
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
                // 事件类型
                String eventType = requestMap.get("Event");
                // 关注
                if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
                    respContent = "谢谢您的关注！";
                }
                // 取消关注
                else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
                    // TODO 取消订阅后用户不会再收到公众账号发送的消息，因此不需要回复
                }
                // 扫描带参数二维码
                else if (eventType.equals(MessageUtil.EVENT_TYPE_SCAN)) {
                    // TODO 处理扫描带参数二维码事件
                }
                // 上报地理位置
                else if (eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)) {
                    // TODO 处理上报地理位置事件
                }
                // 自定义菜单
                else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
                    // TODO 处理菜单点击事件
                    respContent = requestMap.get("EventKey");
                }
            }
            // 设置文本消息的内容
            textMessage.setContent(respContent);
            // 将文本消息对象转换成xml
            respXml = MessageUtil.messageToXml(textMessage);
            respXml = buildMsgXML(textMessage);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return respXml;
    }

    /**
     * <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[fromUser]]></FromUserName>
     <CreateTime>12345678</CreateTime>
     <MsgType><![CDATA[text]]></MsgType>
     <Content><![CDATA[你好]]></Content>
     </xml>
     */
    private static String buildMsgXML(TextMessage result) {
        Map<String,String> map = new HashMap<>(5);
        map.put("FromUserName",result.getFromUserName());
        map.put("ToUserName",result.getToUserName());
        map.put("MsgType",result.getMsgType());
        map.put("CreateTime",result.getCreateTime()+"");
        map.put("Content",result.getContent());
        return buildMsgXML(map);
    }
    private static String buildMsgXML(Map<String, String> result) {
        StringBuilder sb = new StringBuilder();
        sb.append("<xml>");
        sb.append("<ToUserName><![CDATA["+result.get("ToUserName")+"]]></ToUserName>");//响应时，原来的发送这就是接收者
        sb.append("<FromUserName><![CDATA["+result.get("FromUserName")+"]]></FromUserName>");
        sb.append("<CreateTime>"+new Date().getTime()+"</CreateTime>");
        String msgType = result.get("MsgType");
        if ("image".equals(msgType)) {
            sb.append("<MsgType><![CDATA[image]]></MsgType>");
            sb.append("<Image>");
            sb.append("<MediaId>"+result.get("MediaId")+"</MediaId>");
            sb.append("</Image>");
        } else if("voice".equals(msgType)){
            sb.append("<MsgType><![CDATA[voice]]></MsgType>");
            sb.append("<Voice>");
            sb.append("<MediaId>"+result.get("MediaId")+"</MediaId>");
            sb.append("</Voice>");
        }
        else{
            sb.append("<MsgType><![CDATA[text]]></MsgType>");
            sb.append("<Content><![CDATA["+result.get("Content")+"]]></Content>");
        }

        sb.append("</xml>");
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(new Date().getTime());
    }
}
